<?php
/**
 * Наши исключения
 * 
 * Определение основных исключений которые могут возникать в системе
 * @author Anton Zavidov
 * @package myLiveShop
 */

/**
 * Базовое исключение посялаемое ядром
 *
 */
class CoreExeption extends Exception {
	/**
	 * Тип исключения
	 *
	 * @var string
	 */
	protected $type="core";
	/**
	 * Массив уровней важности
	 *
	 * @var array
	 */
	protected $levels=array(
		0=>"info",
		E_NOTICE=>"notice",
		E_WARNING=>"warning",
		E_ERROR=>"error",
		E_USER_NOTICE=>"userNotice"
	);
	/**
	 * Базовый конструктор
	 *
	 * @param string $message Сообщение об ошибке
	 * @param string $level уровень ошибки
	 * @param string $file файл в котором это произошло
	 * @param int $line номер строки
	 * @param array $params параметры которые были переданы в функфию вызвавшие исключение
	 */
	public function __construct($message=false,$level=0,$file=false,$line=false,$params=false) {
		//если нет сообщения то нет и ошибки :)
		if(!$message)return $this;
		
        if(!isset($GLOBALS['errors']))$GLOBALS['errors']=array();
        $GLOBALS['errors'][]=array(
        "type"=>$this->type,
        "level"=>isset($this->levels[$level])?$this->levels[$level]:$level,
        "message"=>$message,
        "file"=>$file,
        "line"=>$line,
        "params"=>$params
        );
        if(isset($GLOBALS['']))
        parent::__construct('', 0);
        if($level==E_ERROR){
        	coreExit();
        }
    }
    /**
     * Показать стек ошибок
     *
     * @param string $type тип возвращаемых данных html/json
     * @return string
     */
    public static function showErrorLog($type="html"){
    	if(!isset($GLOBALS['errors']))return $type=="html"?"":array();
    	$return=array();
    	foreach ($GLOBALS['errors'] as $item) {
    		//собираем рараметры в кучу
    		if($type=="html" && $item['params']){
    			$params="<ul>";
    			foreach ((array)$item['params'] as $key=>$param) {
    				$params.="<li>".$key." = ".$param."</li>\n";
    			}
    			$params.="</ul>";
    		}else{
    			$params="";
    		}
    		$return[]=($type=="html")?
    			"<li class='exeption_".$item['type']." ".$item['level']."'><b>".$item['type']."/".$item['level'].":</b> ".$item['message'].($item['line']?"<i>(<b class='line'>".$item['line']."</b> строка в <b class='file'>".$item['file']."</b>)</i>":"").($params?$params:"")."</li>\n"
    			:$item;
    	}
    	$return=($type=="html")?
    		"<ul>".implode("",$return)."</ul>"
    		:$return;
    	return $return;
    }
    /**
     * Показать ошибки
     *
     * @return string
     */
    public function __toString(){
    	return self::showErrorLog();
    }
    /**
     * Возвратить массив ошибок
     *
     * @return array
     */
    public function __toArray(){
    	return $GLOBALS['errors'];
    }
}


/**
 * Класс програмных ошибок
 *
 */
class ProgrammExeption extends CoreExeption {
	protected $type="programm";
}

/**
 * Класс DB ошибок
 *
 */
class DBExeption extends CoreExeption {
	protected $type="DB";
}

/**
 * Класс для голирования внутренних собятий
 * 
 * Нужен для отладки и оптимизации
 *
 */
class Log extends CoreExeption {
	protected $type="Log";
	public function __construct($message=false,$level=0,$file=false,$line=false,$params=false) {
		if(!Config::_('log_type'))return;
		parent::__construct($message,$level,$file,$line,$params);
	}
	
}